﻿using SQ.BLL.Interfaces;
using SQ.Domain;
using SQ.Infrastructure.DataContexts;
using SQ.SenderNotification.Implementations;
using SQ.SenderNotification.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQ.BLL.Implementation
{
    public class IntegranteFilaBS : IIntegranteFilaBS
    {
        private SmartQueueDataContext data = new SmartQueueDataContext();

        public IList<IntegranteFila> ObterIntegrantesFila(int codigoFila)
        {
            try
            {
                if (codigoFila == 0)
                {
                    throw new Exception("Fila não informada");
                }

                return data.IntegrantesFila.Where(p => p.FilaId == codigoFila
                                            && (p.DataSaidaFila == null || p.DataSaidaFila == DateTime.MinValue)).ToList();
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao buscar integrantes da fila, motivo: {0}", ex.Message));
            }
        }


        public IntegranteFila ObterIntegrante(int codigoFila, int codigoIntegrante)
        {
            try
            {
                return data.IntegrantesFila.FirstOrDefault(p => p.FilaId == codigoFila && p.UsuarioId == codigoIntegrante &&
                    (p.DataSaidaFila == DateTime.MinValue || p.DataSaidaFila == null));
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao buscar integrantes da fila, motivo: {0}", ex.Message));
            }
        }


        public void ChamarIntegrante(IntegranteFila integrante)
        {
            try
            {
                if (integrante != null)
                {
                    EnviarNotificacaoAoUsuario(integrante);

                    RetirarIntegranteFila(integrante);
                }
                else
                {
                    throw new Exception("Integrante não informado");
                }
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao buscar integrantes da fila, motivo: {0}", ex.Message));
            }
        }

        private void EnviarNotificacaoAoUsuario(IntegranteFila integrante)
        {
            ISenderNotification senderSMS = new SenderSmsNotification();

            var mensagem = string.Format("Chegou sua vez! Por favor, dirija-se a recepção do {0}. FastLine", integrante.Fila.Estabelecimento.Nome);
            var toPhoneNumber = string.Format("+55{0}", integrante.Usuario.ContatoTelefonico);

            senderSMS.SendNotification(toPhoneNumber, mensagem);
        }

        private void RetirarIntegranteFila(IntegranteFila integrante)
        {
            integrante.DataSaidaFila = DateTime.Now;
            integrante.FilaId = integrante.Fila.Id;
            integrante.UsuarioId = integrante.Usuario.Id;
            integrante.Fila.EstabelecimentoId = integrante.Fila.Estabelecimento.Id;
            integrante.Fila.Estabelecimento.EnderecoId = integrante.Fila.Estabelecimento.Endereco.Id;

            this.data.Entry(integrante).State = System.Data.Entity.EntityState.Modified;
            this.data.SaveChanges();
        }
    }
}
